// pages/untils/request.js
// 微信小程序网络请求封装

// 基础配置
const config = {
  baseURL: 'https://api.minihealth.com', // 替换为实际的API地址
  timeout: 10000, // 请求超时时间
  header: {
    'Content-Type': 'application/json'
  }
}

/**
 * 网络请求封装
 * @param {Object} options 请求配置
 * @param {String} options.url 请求地址
 * @param {String} options.method 请求方法
 * @param {Object} options.data 请求数据
 * @param {Object} options.header 请求头
 * @param {Boolean} options.loading 是否显示加载提示
 * @param {String} options.loadingText 加载提示文字
 */
function request(options = {}) {
  return new Promise((resolve, reject) => {
    // 显示加载提示
    if (options.loading !== false) {
      wx.showLoading({
        title: options.loadingText || '加载中...',
        mask: true
      })
    }

    // 构建完整的URL
    const url = options.url.startsWith('http') ? options.url : config.baseURL + options.url

    // 合并请求头
    const header = Object.assign({}, config.header, options.header)

    // 添加token（如果存在）
    const token = wx.getStorageSync('token')
    if (token) {
      header.Authorization = `Bearer ${token}`
    }

    wx.request({
      url: url,
      method: options.method || 'GET',
      data: options.data || {},
      header: header,
      timeout: options.timeout || config.timeout,
      success: (res) => {
        // 隐藏加载提示
        if (options.loading !== false) {
          wx.hideLoading()
        }

        // 处理响应
        if (res.statusCode === 200) {
          // 检查业务状态码
          if (res.data.code === 0 || res.data.success) {
            resolve(res.data)
          } else {
            // 业务错误
            const errorMsg = res.data.message || res.data.msg || '请求失败'
            wx.showToast({
              title: errorMsg,
              icon: 'none',
              duration: 2000
            })
            reject(new Error(errorMsg))
          }
        } else if (res.statusCode === 401) {
          // 未授权，清除token并跳转到登录页
          wx.removeStorageSync('token')
          wx.showToast({
            title: '登录已过期，请重新登录',
            icon: 'none'
          })
          // 可以在这里跳转到登录页
          // wx.navigateTo({ url: '/pages/login/login' })
          reject(new Error('未授权'))
        } else {
          // 其他HTTP错误
          const errorMsg = `请求失败 (${res.statusCode})`
          wx.showToast({
            title: errorMsg,
            icon: 'none'
          })
          reject(new Error(errorMsg))
        }
      },
      fail: (err) => {
        // 隐藏加载提示
        if (options.loading !== false) {
          wx.hideLoading()
        }

        // 网络错误处理
        let errorMsg = '网络连接失败'
        if (err.errMsg) {
          if (err.errMsg.includes('timeout')) {
            errorMsg = '请求超时，请检查网络连接'
          } else if (err.errMsg.includes('fail')) {
            errorMsg = '网络请求失败，请检查网络连接'
          }
        }

        wx.showToast({
          title: errorMsg,
          icon: 'none',
          duration: 2000
        })
        reject(new Error(errorMsg))
      }
    })
  })
}

/**
 * GET请求
 * @param {String} url 请求地址
 * @param {Object} params 查询参数
 * @param {Object} options 其他配置
 */
function get(url, params = {}, options = {}) {
  // 将参数拼接到URL中
  if (Object.keys(params).length > 0) {
    const queryString = Object.keys(params)
      .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
      .join('&')
    url += (url.includes('?') ? '&' : '?') + queryString
  }

  return request({
    url,
    method: 'GET',
    ...options
  })
}

/**
 * POST请求
 * @param {String} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 */
function post(url, data = {}, options = {}) {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  })
}

/**
 * PUT请求
 * @param {String} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 */
function put(url, data = {}, options = {}) {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  })
}

/**
 * DELETE请求
 * @param {String} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 */
function del(url, data = {}, options = {}) {
  return request({
    url,
    method: 'DELETE',
    data,
    ...options
  })
}

/**
 * 文件上传
 * @param {String} url 上传地址
 * @param {String} filePath 文件路径
 * @param {String} name 文件对应的key
 * @param {Object} formData 额外的表单数据
 * @param {Object} options 其他配置
 */
function upload(url, filePath, name = 'file', formData = {}, options = {}) {
  return new Promise((resolve, reject) => {
    // 显示上传进度
    if (options.loading !== false) {
      wx.showLoading({
        title: options.loadingText || '上传中...',
        mask: true
      })
    }

    // 构建完整的URL
    const fullUrl = url.startsWith('http') ? url : config.baseURL + url

    // 合并请求头
    const header = Object.assign({}, options.header)

    // 添加token（如果存在）
    const token = wx.getStorageSync('token')
    if (token) {
      header.Authorization = `Bearer ${token}`
    }

    wx.uploadFile({
      url: fullUrl,
      filePath: filePath,
      name: name,
      formData: formData,
      header: header,
      success: (res) => {
        if (options.loading !== false) {
          wx.hideLoading()
        }

        if (res.statusCode === 200) {
          try {
            const data = JSON.parse(res.data)
            if (data.code === 0 || data.success) {
              resolve(data)
            } else {
              const errorMsg = data.message || data.msg || '上传失败'
              wx.showToast({
                title: errorMsg,
                icon: 'none'
              })
              reject(new Error(errorMsg))
            }
          } catch (e) {
            reject(new Error('响应数据解析失败'))
          }
        } else {
          const errorMsg = `上传失败 (${res.statusCode})`
          wx.showToast({
            title: errorMsg,
            icon: 'none'
          })
          reject(new Error(errorMsg))
        }
      },
      fail: (err) => {
        if (options.loading !== false) {
          wx.hideLoading()
        }

        wx.showToast({
          title: '上传失败，请检查网络连接',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

/**
 * 设置基础URL
 * @param {String} baseURL 基础URL
 */
function setBaseURL(baseURL) {
  config.baseURL = baseURL
}

/**
 * 设置默认请求头
 * @param {Object} header 请求头
 */
function setHeader(header) {
  Object.assign(config.header, header)
}

/**
 * 设置超时时间
 * @param {Number} timeout 超时时间（毫秒）
 */
function setTimeout(timeout) {
  config.timeout = timeout
}

// 导出方法
module.exports = {
  request,
  get,
  post,
  put,
  delete: del, // delete是关键字，使用del代替
  upload,
  setBaseURL,
  setHeader,
  setTimeout
}

// 使用示例：
/*
// 在页面中引入
const request = require('../../untils/request.js')

// GET请求
request.get('/api/user/info', { id: 123 })
  .then(res => {
    console.log('用户信息：', res.data)
  })
  .catch(err => {
    console.error('请求失败：', err)
  })

// POST请求
request.post('/api/user/update', {
  name: '张三',
  age: 25
})
  .then(res => {
    console.log('更新成功：', res)
  })

// PUT请求
request.put('/api/user/123', {
  name: '李四',
  age: 30
})

// DELETE请求
request.delete('/api/user/123')

// 文件上传
wx.chooseImage({
  count: 1,
  success: (res) => {
    const filePath = res.tempFilePaths[0]
    request.upload('/api/upload', filePath, 'image')
      .then(res => {
        console.log('上传成功：', res)
      })
  }
})
*/